#include<stdio.h>


int main()
{
    int a[4]={2016,2017,2018,2019};
    int *ptr1 = (int*)(&a + 1);
    int *ptr2 = (int*)((long)a + 1);
    printf("%d,%x\n",ptr1[-1],*ptr2);
    
    //ptr1[i] = *(ptr + i)
    //ptr1[-1] = *(ptr - 1 )
    
    // &a 是一个二级指针，a本身出现是作为一个一级指针指向数组的第一个元素 即'2016'
    //对它取地址，现在的步长是整个数组， 所以&a+1 后，指向数组结束的地方，然后被强制转换成为int*指针
    // 步长变为4位，再-1，就是指向 2019 


    //a本身出现作为一个指针，实际上的值就是地址再被强转成long 就变成值了，+1就是地址移动一位，指向2016的0
    //然后强转成为int*类型，步长变成4 ，内存中是小端存储 2016 变成十六进制 是 0000 07e0然后2017只要再加一
    //2016的小端存储： e0 07 00 00 ;
    // 2017的小端 ：   e1 07 00 00 ;
    // 取值ptr，由于是int*类型，取四位
    // 也就是 07 00 00 e1
    // 再把它转化成正常的数据  也就是e1000007

    return 0;

}